﻿using DataWorks_Tools.MappModals.CalInputModals;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataWorks_Tools.BasicMethods
{
    /// <summary>
    /// FileInfo文件名转时间操作类
    /// </summary>
    public static class DateTimeMethods
    {

        public static int YXHDateDiff(string dateStart, string dateEnd)
        {
            DateTime start = Convert.ToDateTime(dateStart);
            DateTime end = Convert.ToDateTime(dateEnd);
            TimeSpan sp = end.Subtract(start);
            return sp.Days;
        }
        /// <summary>
        /// 把一个日期转成半小时为精度的日期
        /// </summary>
        /// <param name="date">格式为“2021-07-03”</param>
        /// <param name="time">格式为“10_07_03”</param>
        /// <returns></returns>
        public static string YXHDatetoSeconds(string date, string time)
        {
            string[] timestring = time.Split('_');//把小时，分钟，秒数放到这个数组里
            string newminute = (int.Parse(timestring[1]) / 30 * 30).ToString();//把所有的分钟改为小于30分的都是0分，大于30分都是30分
            string newtime = timestring[0] + ":" + newminute + ":" + "00";
            string datetime = date + " " + newtime;
            return datetime;
        }

        /// <summary>
        ///（专用于边缘采集器csv文件） 根据文件名来返回完整的文件日期，例如：2022-02-12 08:12:23
        /// </summary>
        /// <param name="file">FileInfo类型文件</param>
        /// <returns>DateTime</returns>
        public static DateTime YXHFilenametoDateTime(this FileInfo file)
        {
            string date = file.Name.Split("-")[0].Replace("_", "-");
            string time = file.YXHFilenametoHour() + ":" + file.YXHFilenametoMinute() + ":" + file.YXHFilenametoSecond();
            return Convert.ToDateTime(date + " " + time);
        }
        /// <summary>
        /// （专用于边缘采集器csv文件）根据文件名来返回文件日期，例如：2022-02-12
        /// </summary>
        /// <param name="file">FileInfo类型文件</param>
        /// <returns>string</returns>
        public static string YXHFilenametoDate(this FileInfo file)
        {
            return file.Name.Split("-")[0].Replace("_", "-");
        }
        /// <summary>
        /// （专用于边缘采集器csv文件）根据文件名来返回时间几点，例如：08点
        /// </summary>
        /// <param name="file">FileInfo类型文件</param>
        /// <returns>string</returns>
        public static string YXHFilenametoHour(this FileInfo file)
        {
            return file.Name.Split("-")[1].Split("_")[0];
        }
        /// <summary>
        /// （专用于边缘采集器csv文件）根据文件名来返回时间几分，例如：10分
        /// </summary>
        /// <param name="file">FileInfo类型文件</param>
        /// <returns>string</returns>
        public static string YXHFilenametoMinute(this FileInfo file)
        {
            return file.Name.Split("-")[1].Split("_")[1];
        }
        /// <summary>
        ///（专用于边缘采集器csv文件） 根据文件名来返回时间几秒，例如：55秒
        /// </summary>
        /// <param name="file">FileInfo类型文件</param>
        /// <returns></returns>
        public static string YXHFilenametoSecond(this FileInfo file)
        {
            return file.Name.Split("-")[1].Split("_")[2];
        }

        /// <summary>
        /// （专用于边缘采集器）生成合并好的csv文件名（每30分钟模式）
        /// </summary>
        /// <param name="file">FileInfo类型文件</param>
        /// <returns>string合并后文件名</returns>
        public static string YXHGetMergeFilenamebyhalfhour(this FileInfo file)
        {
            string date = file.Name.Split("-")[0];
            string hour = file.Name.Split("-")[1].Split("_")[0];
            string minute = file.Name.Split("-")[1].Split("_")[1];
            if (Convert.ToInt16(minute) < 30)
            {
                return date + "-" + hour + "_" + "01" + "_00-F_1.csv";
            }
            else
            {
                return date + "-" + hour + "_" + "31" + "_00-F_1.csv";
            }
        }

        /// <summary>
        /// （专用于边缘采集器）按照txt来合并csv后的csv文件名，第一个csv和最后一个csv文件名组合而成
        /// </summary>
        /// <param name="file1">List里第一个file</param>
        /// <param name="file2">List里最后一个file</param>
        /// <returns>string合并后的文件名</returns>
        public static string YXHGetMergeFilenamebyTxt(this FileInfo file1, FileInfo file2)
        {
            var file1name = file1.Name.Split(".")[0];
            var file2name = file2.Name.Split(".")[0];
            return file1name + "-to-" + file2name + ".csv";
        }
        /// <summary>
        /// 输入两个字符串List，输出这2个字符串中相同的元素组成的新Array
        /// </summary>
        /// <param name="list1"></param>
        /// <param name="list2"></param>
        /// <returns></returns>
        static string[] FindCommonElements(List<string> list1, List<string> list2)
        {
            List<string> commonElements = list1.Intersect(list2).OrderBy(x => x).ToList();
            return commonElements.ToArray();
        }
        public static int DateDiff(string dateStart, string dateEnd)
        {
            DateTime start = Convert.ToDateTime(dateStart);
            DateTime end = Convert.ToDateTime(dateEnd);
            TimeSpan sp = end.Subtract(start);
            return sp.Days;
        }
        /// <summary>
        /// 从用户输入的起始日期和结束日期来筛选出需要处理的日期文件夹路径数组（包含路径）,用户输入可以跳年
        /// </summary>
        /// <param name="row"></param>
        /// <returns></returns>
        public static string[] YXHGetDirectoryArrayfromDate(BaseCalInputModel row)
        {
            if (row.startdate != null && row.enddate != null)
            {
                //获得结束日期与起始日期之间的天数
                int span = DateTimeMethods.DateDiff(row.startdate, row.enddate);
                if (row.inputpath != null)
                {
                    //创建一个usernames，把客户输入的2个日期之间的日期文件夹名称存入此List中
                    List<string> usernames = new List<string>();
                    //先获取客户输入的起始日期
                    DateTime date = DateTime.ParseExact(row.startdate, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
                    //获得起始日期的几月几日形式
                    string startdatename = date.ToString("MM_dd");
                    //先放入客户输入的起始日期名称
                    usernames.Add(startdatename);
                    for (int i = 0; i < span; i++)
                    {
                        var newdate = date.AddDays(i + 1);
                        usernames.Add(newdate.ToString("MM_dd"));
                    }
                    var usernamedistinct = usernames.Distinct().ToList();
                    //获取路径下的所有文件夹的路径
                    var newinputpath=row.inputpath.YXHPathReplace();
                    if (!Directory.Exists(newinputpath))
                    {
                        return new string[0];
                    }
                    var directories = Directory.GetDirectories(newinputpath);
                    //创建一个originalnames，把路径下的所有日期文件夹名称存入此List中
                    List<string> originalnames = new List<string>();
                    foreach (string subDir in directories)
                    {
                        string folderName = new DirectoryInfo(subDir).Name;
                        originalnames.Add(folderName);
                    }
                    //查看起始日期文件夹名称在List里的index序号
                    var resultnames = FindCommonElements(originalnames, usernamedistinct);
                    var result = resultnames.Select(a => Path.Combine(newinputpath, a)).ToArray();
                    return result;
                }
                else
                {
                    return new string[0];
                }
            }
            else
            {
                return new string[0];
            }
        }

        /// <summary>
        /// 直接将 "2025-10-01" 解析为日期格式并格式化为 "10_01"
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static string ConvertFileNameToDateFormat(this string fileName)
        {
            // 直接将 "2025-10-01" 解析为日期格式并格式化为 "10_01"
            DateTime date = DateTime.ParseExact(fileName, "yyyy-MM-dd", null);
            return date.ToString("MM_dd");  // 输出 "10_01"
        }
    }
}
